package com.zxjbyte.yiyi.framework.common.core.okhttp;

import com.fasterxml.jackson.databind.JsonNode;
import okhttp3.Headers;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;

import java.io.Closeable;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Type;

/**
 * 响应接口
 *
 * @Author zhangxingjia
 * @Date 2024/3/16 14:10
 * @Version: 1.0
 */
public interface IResponseProcessor extends Closeable {

    /**
     * original Request
     * @return
     */
    Request origRequest();

    /**
     * original Response
     * @return
     */
    Response origResponse();

    /**
     * original ResponseBody
     * @return
     */
    ResponseBody origResponseBody();

    /**
     * 获取状态码
     * @return
     */
    int getStatus();

    /**
     * is success
     * @return
     */
    boolean isOk();

    /**
     * Response Headers
     * @return
     */
    Headers responseHeaders();

    /**
     * Returns body String.
     * @return
     */
    String asString();

    /**
     * Returns body to byte arrays.
     * @return
     */
    byte[] asBytes();

    /**
     * Returns body to File.
     * @return
     */
    File asFile();

    /**
     * Returns body to File.
     * @param filePath 文件路径
     * @return
     */
    File asFile(String filePath);

    /**
     * Returns body to File.
     * @param targetFile 目标文件
     * @return
     */
    File asFile(File targetFile);

    /**
     * Returns body to InputStream.
     * @return
     */
    InputStream asStream();

    /**
     * 转换为指定类型的对象
     *
     * @param targetType 目标类型Class
     */
    <T> T toObject(Class<T> targetType);

    /**
     * 转换为复杂泛型类型的对象
     *
     * @param typeReference 类型引用
     */
    <T> T toObject(OkResponse.TypeReference<T> typeReference);

    /**
     * 保持专门的JSON节点方法
     * @return JsonNode
     */
    JsonNode toJsonNode();
}
